# 容器-元组（元素不可以被修改）
# 定义元组
print("-" * 50, "元组定义", "-" * 50)
# 字面量定义
print("字面量定义：", (1, "2", "qwe"))
# 变量定义
tup = ("张三", "李四", 1, 2)
print("变量定义：", tup, f"数据类型:{type(tup)}")
# 定义空元组
tup1 = ()
tup2 = tuple()
print("定义空元组：", tup1, tup2)
# 定义单个元组（后面要跟个逗号，否则类型不是元祖）
tup = ("hello", )
print("定义单个元组", tup)
# 创建元组 从0开始到10（不包括10），步长为2
tup1 = tuple(range(0, 10, 2))
print("range函数tup1：", tup1)
# 嵌套元组
lst = [2, "李四"]
print("列表lst：", lst)
print("元组tup：", tup)
tup1 = (1, "紫嫣", lst, tup)
print("嵌套元组：", tup1)


print("-" * 50, "元组常用方法", "-" * 50)
# 自动解包:注意左边变量的个数要等于右边元组的长度
tup2 = ("紫嫣", "嫣然", "萌萌")
value1, value2, value3 = tup2
print("自动解包：", value1, value2, value3)
# in：某个元素在元组中存不存在  存在返回True  不存在返回False
# not in：某个元素不在元组中   如果不在返回True  如果在 返回False
print(f"zhangsan在不在元组中,不在返回True：{'zhangsan' not in tup1}")
# 元组索引可以取负数，表示从右往左取
print("获取元组下标的元素(-1下标和-3下标)：", tup1[-1], tup1[-3])
# index查询元组元素的下表，如果查找不到会报错，比如查找"张三1"会报错
print("index查找元组，下标为（找不到就抛出异常）：", tup1.index("紫嫣"))
# 元组不可修改，但是里面都list可以修改
print("元组修改之前:", tup1)
tup1[2][1] = "王五"
print("元组不可修改，但是里面都list可以修改:", tup1)
# 统计某个元素的数目
print("统计某个元素的数目：", tup1.count("紫嫣"))
# 元组的长度
print("元组的长度：", len(tup1))
# 元组遍历
print("元组遍历：", end="\t")
for item in tup1:
    print(item, end="   ")
print()


# 元组的生成式不能直接看到内容，需要转化才能看到
print("-" * 50, "元祖生成式", "-" * 50)
tup1 = (f"紫嫣-{item}" for item in range(50))
print("元组生成式无法直接看到内容:", tup1)
print("转化后:", tuple(tup1))
# 使用__next__()方法查看，每查看一次，下次再调用时，会接着上次的地方继续查看
tup2 = (f"嫣然-{item}" for item in range(10) if item % 3 == 0)
print("带条件的元组生成式", tup2)
print("生成式无法查看也可以用__next__()方法查看")
print(tup2, tup2.__next__())
print(tup2, tup2.__next__())
print(tup2, tup2.__next__())
print(tup2, tup2.__next__())


# 练习
print("-" * 50, "练习", "-" * 50)
#作业 str = "万过薪月，员序程马黑来，nothyp学" 取黑马程序员
str = "万过薪月，员序程马黑来，nothyp学"
print(str[-10:-15:-1])
